package com.link.base.base.report.service;

import com.link.base.base.order.model.SaleOrder;
import com.link.base.base.report.model.*;
import com.link.base.base.coupons.model.CollectRecord;
import com.link.base.base.report.model.*;
import com.link.base.base.saleactivity.model.RaffleDetail;
import com.link.base.base.saleactivity.model.SaleActivity;
import com.link.base.base.salestarget.model.SalesTarget;
import com.link.core.basic.query.QueryParams;

import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * @author unknown
 * @date unknown
 * @comments 消费者报表
 */
public interface AccntReportService {
    /**
     * 各渠道任意时间段新增消费者报表
     *
     * @param account
     * @return List PortalBaseDataReport
     * @throws Exception
     */
    List<PortalBaseDataReport> queryAccountEverydayCount(PortalBaseDataReport account) throws Exception;

    /**
     * 得到两个日期之间的所有日期
     *
     * @param startTime
     * @param endTime
     * @return List String
     * @throws Exception
     */
    List<String> getTimeList(String startTime, String endTime) throws Exception;

    /**
     * 查询出门店的销售目标
     *
     * @param salesTarget
     * @return List SalesTarget
     * @throws Exception
     */
    List<SalesTarget> querySalesTarget(SalesTarget salesTarget);

    /**
     * 查询出门店的每月的实际销售
     *
     * @param salesTarget
     * @return List SalesTarget
     * @throws Exception
     */
    List<SaleOrder> querySaleOrders(SalesTarget salesTarget);

    /**
     * 获取两个时间之间的所有月份
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return List String
     * @throws ParseException
     */
    List<String> getMonthBetween(String startTime, String endTime) throws ParseException;

    /**
     * 查询每天的订单金额总数
     *
     * @param order
     * @return List SaleOrder
     */
    List<SaleOrder> queryorderTotalAmountForDay(SaleOrder order);

    /**
     * 查询选定时间段内的订单，按产品名称，和订单金额显示
     *
     * @param order
     * @return List SaleOrder
     */
    List<SaleOrder> querySaleOrderPro(SaleOrder order);

    /**
     * 查询选定时间段查询产品出入库数量汇总
     *
     * @param order
     * @return List StockChangeReport
     */
    List<StockChangeReport> queryProdStockChangeReport(SaleOrder order);

    /**
     * 查询选定时间段内的订单，按产品品牌，和订单金额显示
     *
     * @param order
     * @return List SaleOrder
     */
    List<SaleOrder> querySaleOrderProduct(SaleOrder order);

    /**
     * 根据活动id 查询活动中奖人数和中奖次数
     *
     * @param detail
     * @return List RaffleDetail
     */
    List<RaffleDetail> activetyReport(RaffleDetail detail);


    /**
     * 根据活动id 查询活动奖品领取人数和领取次数
     *
     * @param collectRecord
     * @return List CollectRecord
     */
    List<CollectRecord> queryCollectRecord(CollectRecord collectRecord);

    /**
     * 根据活动id 查询每天的中奖人数
     *
     * @param startTime
     * @param endTime
     * @param number
     * @param activityId
     * @param result
     * @return List RaffleDetail
     */
    List<RaffleDetail> queryCouponForDay(String startTime, String endTime, String number, Long activityId, List<String> result);

    /**
     * 根据活动id 查询每天的中奖次数
     *
     * @param startTime
     * @param endTime
     * @param string
     * @param activityId
     * @param result
     * @return List RaffleDetail
     */
    List<RaffleDetail> queryCouponForDaybynum(String startTime, String endTime, String string, Long activityId,
                                              List<String> result);

    /**
     * 根据活动id 查询每天的领取奖品人数
     *
     * @param startTime
     * @param endTime
     * @param string
     * @param activityId
     * @param result
     * @return List CollectRecord
     */
    List<CollectRecord> querycollectRecordsForDay(String startTime, String endTime, String string, Long activityId,
                                                  List<String> result);

    /**
     * 根据活动id 查询每天的领取奖品次数
     *
     * @param startTime
     * @param endTime
     * @param string
     * @param activityId
     * @param result
     * @return List CollectRecord
     */
    List<CollectRecord> querycollectRecordsForDaynum(String startTime, String endTime, String string, Long activityId,
                                                     List<String> result);

    /**
     * 查询所选时间段内当前登陆用户对应的订单数量以及订单金额
     *
     * @param order
     * @return SaleOrder
     */
    SaleOrder querySaleOrderSum(SaleOrder order);

    /**
     * 查询每天抽奖总人数
     *
     * @param startTime
     * @param endTime
     * @param string
     * @param activityId
     * @param result
     * @return Object
     */
    Object queryallCouponForDay(String startTime, String endTime, String string, Long activityId,
                                List<String> result);

    /**
     * 查询每天抽奖总次数
     *
     * @param startTime
     * @param endTime
     * @param string
     * @param activityId
     * @param result
     * @return Object
     */
    Object queryallCouponnum(String startTime, String endTime, String string, Long activityId, List<String> result);

    /**
     * ②活动数量’统计：所有状态为‘进行中’，‘已结束’，且活动的开始时间在所选择的时间段之内，或者活动的结束时间在所选择的的时间段之内的活动数量
     *
     * @param activity
     * @return SaleActivity
     */
    SaleActivity activitycount(SaleActivity activity);

    /**
     * ③从优惠券领取明细记录表中，筛选统计‘领取时间’在所选日期范围内的优惠券人数/次数；
     *
     * @param collectRecord
     * @return List CollectRecord
     */
    List<CollectRecord> queryCouponscount(CollectRecord collectRecord);

    /**
     * ③从优惠券领取明细记录表中，筛选统计‘使用取时间’在所选日期范围内的优惠券人数/次数；
     *
     * @param collectRecord
     * @return List CollectRecord
     */

    List<CollectRecord> queryCouponsUsecount(CollectRecord collectRecord);

    /**
     * 活动数量
     *
     * @param startTime
     * @param endTime
     * @param string
     * @param result
     * @return List SaleActivity
     */
    List<SaleActivity> NumberOfActivities(String startTime, String endTime, String string, List<String> result);

    /**
     * 优惠券领取人数/使用人数
     *
     * @param startTime
     * @param endTime
     * @param string
     * @param result
     * @param type
     * @param id
     * @return List CollectRecord
     */
    List<CollectRecord> CouponsNumberOfPeople(String startTime, String endTime, String string, List<String> result, String type, String id);

    /**
     * 优惠券领取次数/使用次数
     *
     * @param startTime
     * @param endTime
     * @param string
     * @param result
     * @param type
     * @param id
     * @return List CollectRecord
     */
    List<CollectRecord> CouponsNumber(String startTime, String endTime, String string, List<String> result, String type, String id);

    /**
     * 导出活动结果统计
     *
     * @param map
     * @param qps
     * @param type
     * @return map
     * @throws Exception
     */
    Map<String, Object> campaignResultExport(Map<String, Object> map, QueryParams qps, String type) throws Exception;

    /**
     * 导出活动结果统计
     *
     * @param map
     * @param qps
     * @return map
     * @throws Exception
     */
    Map<String, Object> campaignActivityResultExport(Map<String, Object> map, QueryParams qps) throws Exception;

    /**
     * 查询销售目标
     *
     * @param salesTarget
     * @return List SalesTarget
     * @throws Exception
     */
    public List<SalesTarget> querySalesTargetByShopper(SalesTarget salesTarget) throws Exception;

    /**
     * 查询销售订单
     *
     * @param salesTarget
     * @return List SalesTarget
     * @throws Exception
     */
    public List<SaleOrder> querySaleOrdersByShopper(SalesTarget salesTarget) throws Exception;

    /**
     * 查询目标达成报表数据
     *
     * @author NingLanhao
     * @date 2018-12-25 17:17
     * @param goalAchievement
     * @return java.util.List
     * @throws Exception
     */
    GoalAchievement queryGoalAchievement(GoalAchievement goalAchievement) throws Exception;

    /**
     * 查询客户分析报表汇总数据不带月份选择
     * @param acctAnys
     * @return acctAyns
     * @throws Exception
     */
    public AcctAnys queryAcctAnysReport(AcctAnys acctAnys) throws Exception;

    /**
     * 查询客户分析报表详情不带月份选择
     * @param acctAnys
     * @return list
     * @throws Exception
     */
    public List<AcctAnys> queryByAcctAnysNoMonthDetail(AcctAnys acctAnys) throws Exception;

    /**
     * 查询客户月度销售达成分析报表汇总数据
     * @param acctAnys
     * @return acctAyns
     * @throws Exception
     */
    public AcctAnys queryMonthTargetSale(AcctAnys acctAnys) throws Exception;

    /**
     * 查询客户月度销售达成分析报表详情数据，某省份在某月期间内各客户销售达成情况
     * @param acctAnys
     * @return list
     * @throws Exception
     */
    public List<AcctAnys> queryMonthTargetSaleDetail(AcctAnys acctAnys) throws Exception;

    /**
     * 根据输入的时间查询消费者推荐排行报表
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     * @throws Exception
     */
    public List<AcctCampReport> queryAcctCampByDateRange(String startTime, String endTime) throws Exception;

    /**
     * 本周、本月、本年的查询消费者推荐排行报表
     * @param latelyNum 判断本周本月还是本年的标志
     * @return
     * @throws Exception
     */
    public List<AcctCampReport> queryAcctCamp(String latelyNum) throws Exception;
}
